#include "RestriccionesFactory.h"

using namespace servicios;

RestriccionesFactory::RestriccionesFactory(ContextoDeEjecucion* otroContexto)
{
	this->contexto = otroContexto;
};

InformacionRestriccionesDeterministicas* RestriccionesFactory::Construir(InformacionRestriccionesDeterministicasYAML restriccionYAML)
{
	InformacionRestriccionesDeterministicas* informacionRestricciones = new InformacionRestriccionesDeterministicas();
	informacionRestricciones->SetMateriasMaximasPorCuatrimestre(restriccionYAML.materiasMaximasPorCuatr);
	informacionRestricciones->SetMateriasOptativasACursar(this->Construir(restriccionYAML.materiasOptativasACursar));
	informacionRestricciones->SetMateriasOptativasANoCursar(this->Construir(restriccionYAML.materiasOptativasANoCursar));
	informacionRestricciones->SetDisponibilidadHoraria(this->Construir(restriccionYAML.disponibilidadHoraria));
	return informacionRestricciones;
};

list<DisponibilidadHorariaDiaria*> RestriccionesFactory::Construir(list<DisponibilidadHorariaDiariaYAML> disponibilidadHorariaYAML)
{
	list<DisponibilidadHorariaDiaria*> disponibilidadHoraria;
	list<DisponibilidadHorariaDiariaYAML>::iterator itDispHoraria;
	for(itDispHoraria = disponibilidadHorariaYAML.begin(); itDispHoraria != disponibilidadHorariaYAML.end(); itDispHoraria++)
	{
		DisponibilidadHorariaDiariaYAML unaDispHorariaYAML = *itDispHoraria;
		DisponibilidadHorariaDiaria* unaDisponibilidadHoraria = new DisponibilidadHorariaDiaria(unaDispHorariaYAML.dia, unaDispHorariaYAML.horario);
		disponibilidadHoraria.push_back(unaDisponibilidadHoraria);
	}
	return disponibilidadHoraria;
};

list<InformacionMateria*> RestriccionesFactory::Construir(list<string> materiasOptativasYAML)
{
	list<InformacionMateria*> materiasOptativas;
	list<string>::iterator itMateriasOptativas;
	for(itMateriasOptativas = materiasOptativasYAML.begin(); itMateriasOptativas != materiasOptativasYAML.end(); itMateriasOptativas++)
	{
		string codigoMateriaOptativa = *itMateriasOptativas;
		InformacionMateria* informacionMateria = this->contexto->BuscarInformacionMateria(codigoMateriaOptativa);
		materiasOptativas.push_back(informacionMateria);
	}
	return materiasOptativas;
};

InformacionRestriccionesNoDeterministicas* RestriccionesFactory::Construir(InformacionRestriccionesNoDeterministicasYAML restriccionYAML)
{
	InformacionRestriccionesNoDeterministicas* informacionRestricciones = new InformacionRestriccionesNoDeterministicas();
	informacionRestricciones->SetMateriasDificultosasMaximasPorCuatrimestre(restriccionYAML.materiasDificultosasMaximasPorCuatrimestre);
	informacionRestricciones->SetAjustarPlanAMateriasSinChequeoASistencia(restriccionYAML.ajustarPlanAMateriasSinChequeoAsistencia);
	informacionRestricciones->SetAjustarPlanOmitiendoOptativasPrescindibles(restriccionYAML.ajustarPlanOmitiendoOptativasPrescindibles);
	return informacionRestricciones;
};